/*
 * TablicaSymboli.h
 *
 *  Created on: Nov 24, 2011
 *      Author: bkoziak
 */

#ifndef TABLICASYMBOLI_H_
#define TABLICASYMBOLI_H_

#include <map>
#include <vector>
#include "Symbol.h"
#include "parser.h"

#define BRAK_SYMBOLU 0
#define LOG_TABLICA true
using namespace std;

typedef map<string, Symbol*> MapaSymboli;
typedef vector<Symbol*> WektorSymboli;
typedef map<Symbol*, WektorSymboli> MapaParametrowFunkcji;
typedef vector<string> WektorLexemow;
class TablicaSymboli {
public:
	Symbol* insert(string lexem, int token);
	Symbol* pobierzSymbolWAktualnymZakresie(string lexem);
	Symbol* pobierzSymbolWZakresie(string lexem, int zakres);
	static TablicaSymboli* getInstance();
	void rozpocznijDeklaracje();
	void zakonczDeklaracje();
	bool wTrakcieDeklaracji();
	void wyczyscAktualneID();
	void dodajDoAktualnychID(Symbol* symbol);
	void ustawTypDlaAktualnychID(Symbol::TYP_ZMIENNEJ);
	int zaallokujPamiec(int rozmiar);
	void zaallokujPamiecDlaAktualnychID();
	int otworzZakres();
	int zamknijZakres();
	void deklarujFunkcje(Symbol* symbol, Symbol::TYP_ZMIENNEJ typZwracany);
	void deklarujProcedure(Symbol* symbol);
	void deklarujWspolneDlaProceduryIFUnkcji(Symbol* symbol);
	void przypiszParametry(Symbol* symbol);
	void zaallokujParametry();
	void wyczyscAktualneParametry();
	void dodajAktualneIdDoParametrow();
	void zaallokujPamiecDlaZmiennychTymczasowych();
	Symbol* stworzZmiennaTymczasowa(Symbol::TYP_ZMIENNEJ);
	Symbol* sprawdzPoprawnoscWywolania(Symbol* funkcja);
	WektorSymboli pobierzWektorParametrowFunkcji(Symbol* funkcja);
	void wstawDoWektoraWyrazen(Symbol* symbol);
	void wyczyscWektorWyrazen();
	WektorSymboli pobierzWektorWyrazen();
	virtual ~TablicaSymboli();
	/*
	 * SETTERY I GETTERY
	 */
	int getAktualnyZakres() const;
	void setAktualnyZakres(int aktualnyZakres);
	int getLokalnyZakres() const;
	void setLokalnyZakres(int lokalnyZakres);
	

	/*
	 * UTILS
	 */
	void log();
	Symbol *getAktualnaProceduraLubFunkcja() const;
	void setAktualnaProceduraLubFunkcja(Symbol *aktualnaProceduraLubFunkcja);
    int getOstatniAdresStosu() const;
    void setOstatniAdresStosu(int ostatniAdresStosu);

private:
	static TablicaSymboli* instance;
	MapaSymboli mapaSymboli;
	WektorSymboli aktualneID;
	WektorSymboli aktualneParametry;
	WektorSymboli aktualneParametryFunkcji;
	WektorSymboli aktualneWyrazenia;
	WektorLexemow nazwyZmiennychTymczasowych;
	MapaParametrowFunkcji mapaParametrowFunkcji;
	Symbol* aktualnaProceduraLubFunkcja;
	bool deklaracjeRozpoczete;
	int ostatniAdres;
	int ostatniAdresStosu;
	int aktualnyZakres;
	int lokalnyZakres;
	int ostatnieTymczasoweId;
	double toDouble(string lexem);
	TablicaSymboli();
};

#endif /* TABLICASYMBOLI_H_ */
